﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Получение кода Хэмминга</title>
</head>
<body>
<form  id="Rechenie" name="Rechenie" margin="0" method="POST" action="proverka.php">
<?php
//die('<pre>'.print_r($_POST, TRUE).'</pre>');
$input = $_POST['chislo']; // задаем значение введенное с клавиатуры
$d = strlen($input); // узнаем длину
$p = 2; // задаем самое минимально возможное k
$ln = log10(2); // 
while (pow (2,$p) < ($p + $d + 1)) $p++; // вычисляем по формуле минимальное p
$result = Array(); // заводим массив разрядов
for ($i = 1, $j=1, $n = $p+$d; $i <= $n; $i++)  // проходим по всем разрядам
	{
		if (($i & $i-1) == 0)  // заполняем минусами биты Хэмминга
			{
				$result[$i] = '*';
				continue;
			}
 		$result[$i] = $input[$d-$j];
		$j++;// в информационные разряды записываем исходные данные
	}
	$control = 0;
//print_r($result); 
for ($i = 1, $n = $p+$d; $i <= $p+$d; $i++)  // проходим по всем разрядам
	{
		 if ($result[$i] == 1)
        $control += decbin($i); // если единица, то суммируем 
    }
//echo $control;
$summa = Array();

for ($i = 1; $i <= $p; $i++) //перевод полученной суммы в двоичный вид (исключающее или)
	{
		$per = fmod($control,10);
		if  (fmod($per,2)==0)
			$summa[$i] = 0;
		else 
			$summa[$i] = 1;
		$control = (($control)/10) - $per*0.1;
	} 
//print_r($summa);?><!--Сумма информативных битов<br>--><?php
//print_r($result); ?><!--Расположение битов кода Хэмминга (отмечены '*')<br>--><?php


for ($i = 1, $j = 1; $i < $p+$d+1; $i++)
{
	if ($result[$i] == '*')
	{
		$result[$i] = $summa[$j];
		$j++;
	}
	
	
}

//print_r($result); ?><!--Конечный результат<br>--><?php

// Проверка
for ($i = 1, $n = $p+$d; $i <= $p+$d; $i++)  // проходим по всем разрядам
	{
		 if ($result[$i] == 1)
        $controls += decbin($i); // если единица, то суммируем 
    }

$prsumma = Array();

for ($i = 1; $i <= $p; $i++)
	{
		$per = fmod($controls,10);
		if  (fmod($per,2)==0)
			$prsumma[$i] = 0;
		else 
			$prsumma[$i] = 1;
		$control = (($controls)/10) - $per*0.1;
	} 
//print_r($prsumma);
?><!--Сумма проверки--><?php


$output = ""; 
 
   for ($i= $p+$d; $i >0;  $i--)
 
    $output .= $result[$i];
 
  /* echo $output;*/
?>
<table width="100%">
      <tr>
      	<td width="928">Введенная последовательность:  </td> 				<td  align="left" ><input name="chislo" size="20" type="text" class = "textfield" id="chislo" value="<?php echo $input?>"/></td>
      </tr>
      <tr>
      	<td>Полученный код Хэмминга: </td> 			<td align="left"><input name="znachenie" size="20" type="text" class = "textfield" id = "znachenie" value="<?php echo $output ?>"></td>
    
    <tr>	<td>Для поиска ошибка в полученной последовательности Хэмминга, измените один бит на противоположный. И нажмите проверить! </td> <td width="469"><input id="send" name="send"   type="submit" value="Проверить" /></td> </tr>
  </table>
</body>
</html>